/**
 * 保留 n位小数
 * @param num number 传入的数值
 * @param n number 保留几位
 * @returns string
 */
export function ToFixTOOL(num, n = 2): string {
  return num?.toFixed?.(n) ?? '-';
}

/**
 * 逢千位添加逗号分隔
 * @param num 需要格式化的数字
 * @returns {String} 格式化后的文字
 */
export function ToThousandsTOOL(num: number, placeholder = '-'): string {
  if (!num && num !== 0) {
    return placeholder;
  }

  const str = num.toString().split('.')[1];
  let numStr = num.toString().split('.')[0];
  let result = '';
  while (numStr.length > 3) {
    result = ',' + numStr.slice(-3) + result;
    numStr = numStr.slice(0, numStr.length - 3);
  }
  if (numStr) {
    result = numStr + result + (str === undefined ? '' : '.' + str);
  }
  return result;
}

/**
 * 排名方法
 * @param arr 需要进行排名的数组数据
 * @param order 排名依据的字段,必须是number类型，否则原样
 * @returns arr 排名后的数组数据
 */
export function RankTOOL(arr: any[], order: string): any[] {
  // 筛选有效值
  const validArr: any = arr?.filter?.((a) => a[order] || a[order] === 0);
  if (!validArr || validArr.length < 1) return arr;

  //   排序
  const sortedArr: any[] = validArr.sort((a, b) => b[order] - a[order]);

  //   算排名
  let biggerValue = sortedArr[0][order];
  let currentRank = 1;
  let spacing = 0; // 排名下次要增长的值；数组第一个元素必然+1

  const rankedArr = sortedArr.map((a) => {
    if (a[order] === biggerValue) {
      //   当前值等于上个值
      //   排名与上一个相同，spacing加1
      a.rank = currentRank;
      spacing += 1;
    } else {
      //   当前值小于上个值
      // 当前值作为更大值，与下一个比较
      biggerValue = a[order];
      // 排名+n，
      currentRank += spacing;
      a.rank = currentRank;
      //   spacing归1
      spacing = 1;
    }

    return a;
  });

  //   将不参与排序的无效值， 追加在最后
  const invalidArr = arr.filter((a) => !a[order] && a[order] !== 0);
  rankedArr.push(...invalidArr);

  return rankedArr;
}

/**
 * 写cookies
 * @param name
 * @param value
 */
export function SetCookieTOOL(name, value, day = 30) {
  const Days = day;
  const exp = new Date();
  exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000);
  document.cookie = name + '=' + encodeURIComponent(value) + ';expires=' + exp.toUTCString();
}

/**
 * 读取cookies
 * @param name
 * @returns
 */
export function GetCookieTOOL(name) {
  const reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)');
  const arr = document.cookie.match(reg);
  // return (arr?.[2] ?? null) === 'null' ? null : arr?.[2] ?? null;
  return decodeURIComponent(arr?.[2] ?? 'null') === 'null' ? null : decodeURIComponent(arr?.[2] ?? 'null');
}

/**
 * 删除cookies
 * @param name
 */
export function DelCookieTOOL(name) {
  const exp = new Date();
  exp.setTime(exp.getTime() - 1);
  const cval = GetCookieTOOL(name);
  if (cval != null) {
    document.cookie = name + '=' + cval + ';expires=' + exp.toUTCString();
  }
}

/**
 * 判断传入值是否为Null
 * @param {any} arg1 传入值
 * @returns {Boolean} 是null true,非null false
 */
export function IsNullTOOL(arg1) {
  return !arg1 && arg1 !== 0 && typeof arg1 !== 'boolean' ? true : false;
}

/**
 * 判断传入值是否为字符串null,如果是返回null
 * "null" => null
 * @param {any} arg 传入值
 * @returns {any} any || null
 */
export function StrNullTOOL(arg) {
  return arg === 'null' ? null : arg;
}

/**
 * 页面防抖
 * @param {function} fn 回调方法
 * @param {number} delay 时间
 */
export function ThrottleTOOL(fn, delay) {
  let prev = Date.now();
  return function () {
    const now = Date.now();
    if (now - prev > delay) {
      fn();
      prev = Date.now();
    }
  };
}

/**
 * 改变非0空数据为-
 * @param {string} str 字符串
 */
export function FixEmptyTOOL(str) {
  if (str === 0 || str === '0') return str;
  return str || '-';
}

/**
 * 生成时间字符串
 * @returns 时间字符串 e.g. 2021-11-29 03:55:09
 */
export function CreateTimeTOOL(): string {
  const now = new Date();
  const str = now.toLocaleString('en-GB');
  const arr = str.split(',');
  const date = arr[0].split('/').reverse().join('-');
  return date + '' + arr[1];
}
